/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tri;

import java.util.ArrayList;
import java.util.List;
import util.Util;

/**
 *
 * @author Xuan Huy
 */
public class Rapide {

    /**
     * La liste initiale non triée.
     */
    protected List<Integer> liste;
    /**
     * Le résultat du tri par tas de
     * <code>liste</code>
     */
    protected List<Integer> resultat;

    public Rapide() {
    }

    public Rapide(List<Integer> liste) {
        this.liste = new ArrayList<>(liste);
        this.resultat = new ArrayList<>(liste);
    }

    /**
     * La méthode tri les éléments de la sous-liste de<code>liste</code>,
     * délimitée par
     * <code>debut</code> et
     * <code>fin</code>, et stocke le résultat dans la liste
     * <code>resultat</code>.
     *
     * @param debut indice de début.
     * @param fin indice de fin.
     * @return la liste partiellement triée, les éléments qui n'appartient pas à
     * la sous-liste ne sont pas touchés.
     */
    public List<Integer> triRapide(int debut, int fin) {
        int indicePivot = Util.partitionner(resultat, debut, fin);
        if (indicePivot > debut) {
            triRapide(debut, indicePivot - 1);
        }
        if (indicePivot < fin) {
            triRapide(indicePivot + 1, fin);
        }
        return resultat;
    }

    /**
     * La méthode tri la liste
     * <code>liste</code> dans l'ordre croissant, et stocke le résultat dans la
     * liste
     * <code>resultat</code>.
     *
     * @return la liste triée dans l'ordre croissant.
     */
    public List<Integer> triRapide() {
        resultat = new ArrayList<>(liste);
        return triRapide(0, resultat.size() - 1);
    }

    /**
     * La méthode retourne la liste initiale.
     *
     * @return la liste <code>liste</code> initiale.
     */
    public List<Integer> getListe() {
        return liste;
    }

    /**
     * La méthode remplace la liste initiale par la
     * <code>liste</code> passée en paramètre.
     *
     * @param liste la nouvelle liste initiale.
     */
    public void setListe(List<Integer> liste) {
        this.liste = liste;
    }

    /**
     * La méthode retourne le résultat du tri rapide.
     *
     * @return si {@link tri.Rapide#triRapide()} ou
     * {@link tri.Rapide#triRapide(int, int)} a été invoquée, la liste
     * triée <code>resultat</code> est retournée, sinon la liste
     * initiale <code>liste</code> est retounée.
     */
    public List<Integer> getResultat() {
        return resultat;
    }
}
